home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / xulrunner / python / test / framework.py < prev    next >
Encoding:
Python Source  |  2007-11-12  |  5.4 KB  |  166 lines

  1. import unittest
  2.  
  3. import database
  4. import eventloop
  5. import frontend
  6. import app
  7. import downloader
  8. import views
  9. import util
  10. import databaseupgrade
  11. import storedatabase
  12. import subscription
  13. import selection
  14. from time import sleep
  15.  
  16. util.setupLogging()
  17.  
  18. # Generally, all test cases should extend DemocracyTestCase or
  19. # EventLoopTest.  DemocracyTestCase cleans up any database changes you
  20. # might have made, and EventLoopTest provides an API for accessing the
  21. # eventloop in addition to managing the thread pool and cleaning up
  22. # any events you may have scheduled.
  23. # Our general strategy here is to "revirginize" the environment after
  24. # each test, rather than trying to reset applicable pieces of the
  25. # environment before each test. This way, when writing new tests you
  26. # don't have to anticipate what another test may have changed, you
  27. # just have to make sure you clean up what you changed. Usually, that
  28. # is handled transparently through one of these test cases
  29.  
  30. class HadToStopEventLoop(Exception):
  31.     pass
  32.  
  33. class DummyMainFrame:
  34.     def __init__(self):
  35.         self.displays = {}
  36.         self.mainDisplay = "mainDisplay"
  37.         self.channelsDisplay = "channelsDisplay"
  38.         self.collectionDisplay = "collectionDisplay"
  39.         self.videoInfoDisplay = "videoInfoDisplay"
  40.  
  41.     def selectDisplay(self, display, area):
  42.         self.displays[area] = display
  43.  
  44.     def getDisplay(self, area):
  45.         return self.displays.get(area)
  46.  
  47.     def onSelectedTabChange(self, tabType, multiple, guideURL, videoFilename):
  48.         pass
  49.  
  50. class DummyVideoDisplay:
  51.     def fileDuration (self, filename, callback):
  52.         pass
  53.  
  54.     def fillMovieData (self, filename, movie_data, callback):
  55.         pass
  56.  
  57. class DummyController:
  58.     def __init__(self):
  59.         self.selection = selection.SelectionHandler()
  60.         self.frame = DummyMainFrame()
  61.         self.videoDisplay = DummyVideoDisplay()
  62.  
  63. class DemocracyTestCase(unittest.TestCase):
  64.     def setUp(self):
  65.         database.set_thread()
  66.         views.initialize()
  67.         # reset the event loop
  68.         util.chatter = False
  69.         self.oldUtilDotFailed = util.failed
  70.         self.failedCalled = False
  71.         self.utilDotFailedOkay = False
  72.         def newUtilDotFailed(*args, **kwargs):
  73.             if self.utilDotFailedOkay:
  74.                 self.failedCalled = True
  75.             else:
  76.                 print "util.failed called!"
  77.                 print "args: %s kwargs: %s"  % (args, kwargs)
  78.                 import traceback
  79.                 if kwargs.get('withExn'):
  80.                     traceback.print_exc()
  81.                 else:
  82.                     traceback.print_stack()
  83.                 raise Exception("util.failed called")
  84.         util.failed = newUtilDotFailed
  85.         app.controller = DummyController()
  86.  
  87.     def tearDown(self):
  88.         util.chatter = True
  89.  
  90.         # Remove any leftover database
  91.         database.resetDefaultDatabase()
  92.  
  93.         # Remove anything that may have been accidentally queued up
  94.         eventloop._eventLoop = eventloop.EventLoop()
  95.  
  96. class EventLoopTest(DemocracyTestCase):
  97.     def setUp(self):
  98.         DemocracyTestCase.setUp(self)
  99.         self.hadToStopEventLoop = False
  100.  
  101.     def stopEventLoop(self, abnormal = True):
  102.         self.hadToStopEventLoop = abnormal
  103.         eventloop.quit()
  104.  
  105.     def runPendingIdles(self):
  106.         idleQueue = eventloop._eventLoop.idleQueue
  107.         urgentQueue = eventloop._eventLoop.urgentQueue
  108.         while idleQueue.hasPendingIdle() or urgentQueue.hasPendingIdle():
  109.             urgentQueue.processIdles()
  110.             idleQueue.processNextIdle()
  111.  
  112.     def runEventLoop(self, timeout=10, timeoutNormal=False):
  113.         eventloop.threadPoolInit()
  114.         try:
  115.             self.hadToStopEventLoop = False
  116.             timeout = eventloop.addTimeout(timeout, self.stopEventLoop, 
  117.                                            "Stop test event loop")
  118.             eventloop._eventLoop.quitFlag = False
  119.             eventloop._eventLoop.loop()
  120.             if self.hadToStopEventLoop and not timeoutNormal:
  121.                 raise HadToStopEventLoop()
  122.             else:
  123.                 timeout.cancel()
  124.         finally:
  125.             eventloop.threadPoolQuit()
  126.  
  127.     def addTimeout(self,delay, function, name, args=None, kwargs=None):
  128.         eventloop.addTimeout(delay, function, name, args, kwargs)
  129.  
  130.     def addWriteCallback(self, socket, callback):
  131.         eventloop.addWriteCallback(socket, callback)
  132.  
  133.     def removeWriteCallback(self, socket):
  134.         eventloop.removeWriteCallback(socket)
  135.  
  136.     def addIdle(self, function, name, args=None, kwargs=None):
  137.         eventloop.addIdle(function, name, args=None, kwargs=None)
  138.  
  139.     def hasIdles(self):
  140.         return not (eventloop._eventLoop.idleQueue.queue.empty() and
  141.                     eventloop._eventLoop.urgentQueue.queue.empty())
  142.  
  143.     def processThreads(self):
  144.         eventloop._eventLoop.threadPool.initThreads()
  145.         while not eventloop._eventLoop.threadPool.queue.empty():
  146.             sleep(0.05)
  147.         eventloop._eventLoop.threadPool.closeThreads()
  148.  
  149.     def processIdles(self):
  150.         eventloop._eventLoop.idleQueue.processIdles()
  151.         eventloop._eventLoop.urgentQueue.processIdles()
  152.  
  153. class DownloaderTestCase(EventLoopTest):
  154.     def setUp(self):
  155.         EventLoopTest.setUp(self)
  156.         # FIXME: This is kind of ugly
  157.         app.delegate = frontend.UIBackendDelegate()
  158.         downloader.startupDownloader()
  159.  
  160.     def tearDown(self):
  161.         downloader.shutdownDownloader(eventloop.quit)
  162.         self.runEventLoop()
  163.         app.delegate = None
  164.         EventLoopTest.tearDown(self)
  165.